package edu.uoc.vmerinom.tfc.support;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.log.Log;

/**
 * Clase de soporte para el envío de correos electrónicos. Contiene métodos para
 * enviar correos mediantes un servidor SMTP a uno o varios destinatarios.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("mailSupport")
@Scope(ScopeType.APPLICATION)
public class Mail implements Serializable {
	/**
	 * Default Serial Version ID.
	 */
	static final long serialVersionUID = 1L;
	/**
	 * Log para la trazabilidad de errores.
	 */
	@Logger
	static Log log;

	/**
	 * Envía un correo electrónico a través de un servidor SMTP a un único
	 * destinatario.
	 * 
	 * @param recipient
	 *            Destinatario
	 * @param subject
	 *            Asunto
	 * @param message
	 *            Mensaje
	 * @return <code>true</code> si se ha realizado el envío correctamente.
	 *         <code>false</code> en caso contrario.
	 */
	public static boolean send(String recipient, String subject, String message) {
		if (log != null && log.isDebugEnabled()) {
			log.debug("Mail.send(" + recipient + ", " + subject + ", " + message + ")");
		}
		List<String> recipients = new ArrayList<String>();
		recipients.add(recipient);
		return send(recipients, subject, message);
	}

	/**
	 * Envía un correo electrónico a varios destinatarios a través de un
	 * servidor SMTP.
	 * 
	 * @param recipients
	 *            Lista con los destinatarios
	 * @param subject
	 *            Asunto
	 * @param message
	 *            Mensaje
	 * @return <code>true</code> si se ha realizado el envío correctamente.
	 *         <code>false</code> en caso contrario.
	 */
	public static boolean send(List<String> recipients, String subject, String message) {
		if (log != null && log.isDebugEnabled()) {
			log.debug("Mail.send(" + recipients + ", " + subject + ", " + message + ")");
		}
		boolean success = true;
		final Map<String, String> properties = Utils.getProperties("mail");
		try {
			final Email email = new HtmlEmail();
			if (log != null && log.isDebugEnabled()) {
				log.debug("Host: " + properties.get("mail.smtp.host"));
			}
			email.setHostName(properties.get("mail.smtp.host"));
			if (log != null && log.isInfoEnabled()) {
				log.info("From: " + properties.get("mail.from.email"));
			}
			final String user = properties.get("mail.smtp.user");
			final String pass = properties.get("mail.smtp.pass");
			if (user != null && !"".equals(user) && pass != null && !"".equals(pass)) {
				email.setAuthentication(user, pass);
			}
			email.setFrom(properties.get("mail.from.email"));
			email.setSubject(subject);
			email.setMsg(message);
			for (final String recipient : recipients) {
				if (log != null && log.isInfoEnabled()) {
					log.info("To: " + recipient);
				}
				email.addBcc(recipient);
			}
			email.send();
		} catch (final EmailException e) {
			if (log != null) {
				log.error("No se ha podido enviar el correo electrónico");
			}
			success = false;
		}

		return success;
	}

}
